Simulators are often used to predict system (e.g., processor, memory, external modules, etc.) performance. Two common types of simulators used are functional simulators and performance (or cycle-accurate) simulators. Functional simulators simply emulate the semantic behavior of programs without giving information regarding execution times. On the other hand, performance simulators provide more detailed and accurate execution statistics including cycle times and detailed pipeline flows.
However, due to the detailed nature of performance simulators they are somewhat slow. It is not uncommon for performance simulators to be 1,000 times slower than functional simulators. Often, a program may take days or weeks to run on a performance simulator. Consequently, detailed performance simulators may be useless for all but small programs. Moreover, performance simulators are not readily integrated into larger simulation environments as a result.
One common use of simulators is analyzing the behavior of a small but critical code segment of a large program. The behavior of the remaining portions of the program is often irrelevant or of little relevance. It is often desired to gather statistics only for the small portion of code that is of interest. Since there is no easy mechanism for specifying the region of code of interest and limiting the gathering of statistics to that region alone, the statistics gathering is often polluted and takes longer than necessary.